#include <stdio.h>
#include <stdbool.h>
#include <stdlib.h>

#define TYPE int


typedef struct Node
{
	TYPE data;
	struct Node* next;
}Node;

Node* create_node(TYPE data)
{
	Node* node = malloc(sizeof(Node));
	node->data = data;
	node->next = NULL;
	return node;
}

typedef struct Queue
{
	Node* head;
	Node* tail;
	size_t size;
}Queue;

// 创建
Queue* create_queue(void);
// 销毁
void destory_queue(Queue* queue);
// 入队
void push_queue(Queue* queue,TYPE data);
// 出队
bool pop_queue(Queue* queue);
// 队头
TYPE* head_queue(Queue* queue);
// 队尾
TYPE* tail_queue(Queue* queue);
// 队空
bool empty_queue(Queue* queue);


int main()
{
	Queue* queue = create_queue();
	for(int i=0; i<10; i++)
	{
		push_queue(queue,rand()%20);
		printf("push:%d\n",*tail_queue(queue));
	}
	for(int i=0; i<10; i++)
	{
		printf("pop:%d ",*head_queue(queue));
		printf("%s\n",pop_queue(queue)?"yes":"no");
	}
	destory_queue(queue);
}

// 创建
Queue* create_queue(void)
{
	Queue* queue = malloc(sizeof(Queue));
	queue->head = NULL;
	queue->tail = NULL;
	queue->size = 0;
	return queue;
}
// 销毁
void destory_queue(Queue* queue)
{
	while(pop_queue(queue));
	free(queue);
}
// 入队
void push_queue(Queue* queue,TYPE data)
{
	Node* node = create_node(data);
	if(empty_queue(queue))
	{
		queue->head = node;
		queue->tail = node;
	}
	else
	{
		queue->tail->next = node;
		queue->tail = node;
	}
	queue->size++;
}
// 出队
bool pop_queue(Queue* queue)
{
	if(empty_queue(queue)) return false;
	Node* node = queue->head;
	queue->head = node->next;
	if(queue->size == 1)
		queue->tail = NULL;
	free(node);
	queue->size--;
	return true;
}
// 队头
TYPE* head_queue(Queue* queue)
{
	if(empty_queue(queue)) return NULL;
	return &queue->head->data;
}
// 队尾
TYPE* tail_queue(Queue* queue)
{
	if(empty_queue(queue)) return NULL;
	return &queue->tail->data;
}
// 队空
bool empty_queue(Queue* queue)
{
	return !queue->size;
}
